package com.xuanyuanxinyu.func.network.retrofit

import com.xuanyuanxinyu.func.network.internal.MyDns
import com.xuanyuanxinyu.func.network.internal.OkHttpEventListener
import okhttp3.ConnectionPool
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit

/**
 * @FileName:
 * @Description:
 * @author ken.luo
 * @date 2023/4/4
 * @version V1.0
 * @email 424533553@qq.com
 */
object RetrofitManager {
    var TAG : String = "Retrofit_Log"

    var BASEURL = "https://www.baidu.com"
    fun getRetrofit() : Retrofit {
        return Retrofit.Builder()
                .baseUrl(BASEURL)
                // 用于向Retrofit实例添加一个或多个ConverterFactory。ConverterFactory负责将HTTP响应体转换为Java对象，或者将Java对象转换为请求体。
                // 最常用的ConverterFactory之一是GsonConverterFactory，它使用Gson库来处理JSON数据的序列化和反序列化。

                // 除了GsonConverterFactory之外，Retrofit还支持其他类型的ConverterFactory，例如MoshiConverterFactory、JacksonConverterFactory等，
                // 你可以根据需要选择合适的ConverterFactory来处理不同格式的数据。
                .addConverterFactory(GsonConverterFactory.create())
                // 添加RxJava2调用适配器工厂
                // 你可以将 Retrofit 的网络请求与 RxJava 的响应式编程模型结合起来，从而使得异步处理和错误处理变得更加简洁和强大。同样的方法也可以用于添加其他类型的 CallAdapter.Factory，比如支持 LiveData 的 CallAdapter。
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())

//                    .addCallAdapterFactory(RxJava2CallAdapterFactory .createWithScheduler(Schedulers.newThread()))
                .client(createOkHttpClient())
                .build()
    }

    /**
     * 创建Okhttp
     */
     fun createOkHttpClient() : OkHttpClient {
        val okHttpBuilder : OkHttpClient.Builder = OkHttpClient.Builder()
        okHttpBuilder.apply {
            // .sslSocketFactory(createSSLSocketFactory()).hostnameVerifier(TrustAllHostnameVerifier())
            addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) // 添加日志拦截器
            connectionPool(ConnectionPool(8, 10, TimeUnit.MINUTES))
            // 超时时间需要设置合理，不然容易网络超时
            readTimeout(20, TimeUnit.SECONDS)
            writeTimeout(20, TimeUnit.SECONDS)
            connectTimeout(20, TimeUnit.SECONDS)
            // 监听各网络耗时时长
            eventListener(OkHttpEventListener())
            // 设置自定义DNS
            dns(MyDns())
            // 拦截网络请求信息
            addNetworkInterceptor(getCustomerLogInterceptor())
            addInterceptor(AppointUrlInterceptor())
            // 默认情况下，OkHttp 的 retryOnConnectionFailure 设置为 true，这意味着当遇到以下几种情况时，OkHttp 会自动重试请求：
            //连接问题：如果无法建立到服务器的初始连接，例如因为网络不可用。
            //读取数据时的连接中断：如果在读取服务器响应时连接突然中断。
            //已知的服务器问题：如果服务器返回了一个指示它是临时问题的响应，比如一个5xx响应码。
            retryOnConnectionFailure(false) // 添加重试拦截器
            //  addInterceptor(OkHttpRetryInterceptor(3))
            //自定义的拦截日志，拦截简单东西用，后面会有介绍
            //            addInterceptor(Interceptor { chain-> // 拦截添加header 参数
            //                val builder = chain.request().newBuilder();
            //                builder.addHeader("user_id","421087"); // header参数添加
            //                chain.proceed(builder.build());
            //            })


            // 设置证书
            sslSocketFactory(SSLSocketClient.sSLSocketFactory(), SSLSocketClient.trustManager[0])
            hostnameVerifier(SSLSocketClient.hostnameVerifier)
        }
        val client = okHttpBuilder.build()
        return client
    }

//    private fun getLogInterceptor() : HttpLoggingInterceptor {
//        val interceptor = HttpLoggingInterceptor { message->
//            try {
//                var value = message.replace("%(?![0-9a-fA-F]{2})".toRegex(), "%25")
//                value = value.replace("\\+".toRegex(), "%2B")
//                val text = URLDecoder.decode(value, "utf-8")
//                Log.e("OKHttp-----", text)
//            } catch (e : UnsupportedEncodingException) {
//                e.printStackTrace()
//                Log.e("OKHttp-----", message)
//            }
//        }
//        val level = interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
//        return interceptor
//    }





}
